package cloud.xiangyixiang.www.spring.boot.java.basics.controller;

import cloud.xiangyixiang.www.spring.boot.java.basics.enums.*;
import cloud.xiangyixiang.www.spring.boot.java.basics.utils.StudyJavaUtil;

import java.util.*;

/**
 * <p>
 * JAVA Enum 枚举
 * </p>
 *
 * @author zhixinglu
 * @date 2023/9/5 11:49
 */
public class EnumController {

    public static void main(String[] args) {
        description();

        test1();

        test2();

        test3();

        test4();

        test5();
    }

    public static void description(){

        System.out.println("介绍详情：==================");

        System.out.println("和普通类一样，可以使用构造器、定义成员变量和方法，也能实现一个或多个接口。但是不能继承其他类。");

        System.out.println();
    }

    /**
     * 枚举类的方法调用
     */
    private static void test1(){
        System.out.println("枚举类的方法：=========================");

        // 1、ordinal(), 枚举顺序值
        System.out.println("枚举顺序值," + WeekEnum.MONDAY.ordinal());

        /*
         * 2、valueOf()
         * public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
         * enumType -- 这是枚举类型，返回一个常量的类的对象。
         * name -- 这是常量，要返回的名称。
         * return:此方法返回具有指定名称的枚举类型的枚举常量。
         * 如果你传了一个不存在的字符串，那么会抛出异常。
         * */
        WeekEnum week = Enum.valueOf(WeekEnum.class, WeekEnum.MONDAY.name());
        WeekEnum week1 = WeekEnum.valueOf(WeekEnum.MONDAY.name());
        // MONDAY
        System.out.println("Enum.valueOf," + week);
        // MONDAY
        System.out.println("WeekEnum.valueOf," + week1);

        // 3、values()
        //返回一个Weekday数组,[Ljavase.enumeration.Weekday;@2a84aee7
        System.out.println("WeekEnum.values()," + Arrays.toString(WeekEnum.values()));

        // 4、通过compareTo方法比较,实际上其内部是通过ordinal()值比较的 false
        System.out.println("WeekEnum.MONDAY.compareTo(Weekday.TUESDAY)," + WeekEnum.MONDAY.compareTo(WeekEnum.TUESDAY));

        // 5、获取该枚举对象的Class对象引用,当然也可以通过getClass方法
        Class<?> declaringClass = WeekEnum.MONDAY.getDeclaringClass();
        // javase.enumeration.Weekday
        System.out.println("获取该枚举对象的Class对象引用, " + declaringClass);

        // 6、通过getEnumConstants()获取该枚举类型的所有元素，如果Class对象不是枚举类型，则返回null。
        Object[] enumConstants = declaringClass.getEnumConstants();
        //枚举类个数,Weekday.values().length)
        for (int i = 0; i < WeekEnum.values().length; i++) {
            //SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY
            System.out.println("getEnumConstants: " + enumConstants[i]);
        }

        // 7、判断是否是枚举类型 true
        System.out.println("declaringClass.isEnum()," + declaringClass.isEnum());

        //8、获取枚举变量的属性
        System.out.println("编号: "+WeekEnum.MONDAY.getId()+", 含义: " + WeekEnum.MONDAY.getMeaning());

        System.out.println();
    }

    /**
     * 枚举类定义抽象方法
     */
    private static void test2(){
        System.out.println("枚举类定义抽象方法：==================");

        System.out.println("SPRING下一个季节开始月份：" + SeasonEnum.SPRING.getNextSeason().getMonthStart());
        System.out.println("SPRING下一个季节名称：" + SeasonEnum.SPRING.getNextSeason().getSeason());

        System.out.println();
    }


    /**
     * 枚举类实现接口
     */
    private static void test3() {
        System.out.println("枚举类实现接口: =====================");

        StudyEnum.MONDAY.studyDataStrucure();

        System.out.println();
    }

    /**
     * 枚举类实现单例
     */
    private static void test4() {
        System.out.println("枚举类实现单例：==============");

        BeanContextEnum.INSTANCE.print();
        BeanContextEnum.INSTANCE.print();
        BeanContextEnum.INSTANCE.print();
        BeanContextEnum.INSTANCE.print();

        System.out.println();
    }

    /**
     * 枚举MAP
     */
    private static void test5() {
        System.out.println("枚举MAP：===============");

        List<StudyJavaUtil> list = new ArrayList<>();
        list.add(new StudyJavaUtil("January", ProjectEnum.SSH));
        list.add(new StudyJavaUtil("February", ProjectEnum.SSM));
        list.add(new StudyJavaUtil("March", ProjectEnum.SSM));
        list.add(new StudyJavaUtil("April", ProjectEnum.SPRINGBOOT));
        list.add(new StudyJavaUtil("May", ProjectEnum.SPRINGBOOT));
        list.add(new StudyJavaUtil("June", ProjectEnum.SPRINGCLOUD));

        // 1、使用hashmap
        Map<ProjectEnum, Integer> hashMap = new HashMap<>(6);
        for (StudyJavaUtil studyJava:list){
            ProjectEnum project = studyJava.getProjectEnum();
            hashMap.merge(project, 1, Integer::sum);
        }
        System.out.println(hashMap);

        // 2、使用EnumMap
        Map<ProjectEnum, Integer> enumMap = new EnumMap<>(ProjectEnum.class);
        for (StudyJavaUtil studyJava:list){
            ProjectEnum project = studyJava.getProjectEnum();
            enumMap.merge(project, 1, Integer::sum);
        }
        System.out.println(enumMap);

        System.out.println();
    }

}
